/**
 @file xbee_driver.h
 @brief Rutinas para la comunicación con el dispositivo y recepción y envío de tramas API XBee Serie 1, en modo API 1.
 @date   01/06/2012
 @version v.0.9
 @author Julian Ovalle
         julianovalle@ula.ve
*/

#ifndef XBEE_DRIVER_H_
#define XBEE_DRIVER_H_

#include "serial.h"
#include "xbee_driver_def.h"

//#define XBEE_DRV_DEBUG
//#define XBEE_API_DEBUG

/*!
   @brief Enviar trama de data con dirección de 16bits.
   @param serial_fd Descriptor del puerto serie.
   @param *payload data a enviar.
   @param size tamaño de la data a enviar
   @param addr dirección de destino
   @param frameId identificador de la trama (0 si no se desea un ACK)
 */
int sendPacket_16 (int serial_fd, char * payload, uint8_t size, uint8_t api_type, unsigned int addr, int frameId );
/*!
   @brief Enviar trama de data con dirección de 64bits.
   @param serial_fd Descriptor del puerto serie.
   @param *payload data a enviar.
   @param size tamaño de la data a enviar
   @param addr dirección de destino
   @param frameId identificador de la trama (0 si no se desea un ACK)
 */
int sendPacket_64 (int serial_fd, char * payload, uint8_t size, uint8_t api_type, uint64_t addr64, int frameId );
/*!
   @brief Enviar comando AT al dispositivo.
   @param serial_fd Descriptor del puerto serie.
   @param *command comando a enviar y su valor(opcional)
   @param frameId identificador de la trama y de la respuesta subsiguiente
   @param size tamaño de la data a enviar
 */
int ATCommand (int serial_fd, char * command, int frameId, int size );
/*!
   @brief Enviar comando AT remoto.
   @param serial_fd Descriptor del puerto serie.
   @param *command comando a enviar y su valor(opcional)
   @param size tamaño de la data a enviar
   @param frameId identificador de la trama (0 si no se desea un ACK)
   @param addr16 dirección de destino de 16bits
   @param addr64 dirección de destino de 64bits
   @param opts opciones
 */
int remoteATCommand (int serial_fd, char * command, uint8_t size, uint8_t frameId, uint16_t addr16, uint64_t addr64, uint8_t opts );
/*!
   @brief Inicia la comunicación con el puerto serie, crea la cola general de tramas salientes y prepara el bufer de recepción.
   @param *device ubicación del puerto serie @see SERIAL_PORT
   @param brate velocidad en baudios
   @param *dev[out] contenedor del dispositivo a inicializar
   @return 0 en caso de exito. -1 en caso de error
 */
int xbeeDriverInit(const char *device, speed_t brate, struct xbee_device *dev);
/*!
   @brief Recibir tramas XBee y colocarlas en el bufer de entrada de *mod
   @param timeout_usec tiempo máximo de espera en useg
   @param timeout_sec tiempo máximo de espera en seg @see FRAME_RECV_TIMEOUT_SEC
   @param *mod[out] contenedor del dispositivo
   @return 0 en caso de exito. -1 en caso de error o timeout
 */
int receiveFrames(struct xbee_device *mod, int timeout_usec, int timeout_sec);
/*!
   @brief Enviar la trama proveniente de la cola de salida
   @param *mod contenedor del dispositivo
   @param TX trama XBee a enviar
 */
void sendFrames(struct xbee_device *mod,struct msgbuf_tx TX);
/*!
   @brief Finaliza la comunicación con el puerto serie, destruye la cola general de tramas salientes y libera el bufer de recepción.
   @param *dev[out] contenedor del dispositivo
   @return 0 en caso de exito. -1 en caso de error
 */
int xbeeDriverExit (struct xbee_device * dev);

#endif /* XBEE_H_ */
